/*
 * @Author: '浪川' '1214391613@qq.com'
 * @Date: 2025-07-04 16:15:55
 * @LastEditors: '浪川' '1214391613@qq.com'
 * @LastEditTime: 2025-08-20 16:55:42
 * @FilePath: \passiflora-edulis-sims\src\interfaces\Responses\AIRes.ts
 * @Description: 接收AI接口生成的拼图页数据 的 接口
 *
 * Copyright (c) 2025 by '1214391613@qq.com', All Rights Reserved.
 */

// 覆盖指定类型的单个类型
export type Omit<T, K extends keyof T> = Pick<T, Exclude<keyof T, K>>
// /v1/ai/double-puzzle 请求参数类型
export interface AiPuzzleReq {
  model: string // 使用的AI模型
  title: string // 谜题标题
  instruction: string // 生成指令
  puzzle_num: number // 谜题数量
  puzzle_words_num: number // 每个谜题的单词数
  lang: string
}
// 拼图的基本属性 便于继承和创建类型守卫
export interface IbaseAiPuzzleRes {
  title: string // 谜题标题
  instructions: string // 操作指引
  words: string[] // 单词列表
}

export type IAiWordSearchRes = IbaseAiPuzzleRes

// 返回的 DoublePuzzle 结构（单个谜题项）
export interface IAiDoublePuzzleRes extends IbaseAiPuzzleRes {
  messages: string[] // 附加消息
  reveal_letters: string[] // 揭示的字母
}

// 定义类型守卫函数
export function isAiDoublePuzzleRes(data: unknown): data is IAiDoublePuzzleRes {
  return Array.isArray(data) && data.some((item) => 'reveal_letters' in item)
}

// 纵横字谜的AI返回的数据类型
export interface IAiCrossWordRes extends Omit<IbaseAiPuzzleRes, 'words'> {
  words: Record<string, string> // 单词列表
}

// 类型守卫函数
export function isAiCrossWordRes(obj: unknown): obj is IAiCrossWordRes {
  // 首先检查是否为对象且不为null
  if (typeof obj !== 'object' || obj === null) {
    return false
  }

  // 检查 words 属性是否存在且为对象（Record<string, string>）
  if (
    !('words' in obj) ||
    typeof obj.words !== 'object' ||
    Array.isArray(obj.words) ||
    obj.words === null
  ) {
    return false
  }

  // 验证 words 的所有值都是字符串
  const words = obj.words
  return Object.values(words).every((value) => typeof value === 'string')
}
